home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / ezy_comm / ezy1023.zip / EKIT102.ZIP / EZYFOS.PAS < prev    next >
Pascal/Delphi Source File  |  1992-10-24  |  21KB  |  614 lines

  1. (* EZYFOS V1.00  (C) Peter Davues 1992.  All Rights Reserved.
  2.  
  3.    This unit is the copyrighted works of Peter Davies.  Peter Davies
  4.    reserves all rights on this material.  Use of this library is
  5.    granted freely, however due credit must be given to Peter Davies.
  6.  
  7.    This source may be freely used as long as due credit is given.
  8.    That means, in your documentation, you MUST acknowledge that
  9.       "EZYFOS (C) Peter Davies 1992" was used.
  10.  
  11.    If, this acknowledgement is a problem, then you MUST purchase
  12.    this unit.  Cost $AUD40. Contact Peter Davies Fido 3:636/213
  13.    for purchasing details.
  14.  
  15.    No liability whatsoever is given for this unit.  You accept all
  16.    responsibility whatsoever.
  17.  
  18.    For improvements, please contact Peter Davies Fido 3:636/213
  19.  
  20.    For use with Turbo Pascal V6.0-> ONLY *)
  21.  
  22. Unit ezyfos;
  23.  
  24. {$O+,F+,R-,S-,V-}
  25. Interface
  26. uses crt, dos;
  27.  
  28. const
  29.    carrierdetectvalue : byte    = $80;     (* value to and AND for carrier *)
  30.    remoteoutput       : boolean = false;   (* do remote output *)
  31.    remoteinput        : boolean = false;   (* do remote input  *)
  32.    localoutput        : boolean = true;    (* do local output  *)
  33.    localinput         : boolean = true;    (* do local input   *)
  34.    fossilactive       : boolean = false;   (* has fossil been activated? *)
  35.    curattr            : byte    = 7;       (* Current Text Attribute *)
  36.    terminalcap        : byte    = 0;       (* User's Terminal Capabilities *)
  37.              (* Bit 0 : ANSI
  38.                     1 : Avatar
  39.                     2-7 [Reserved]
  40.                         TTY assumed TRUE always *)
  41.  
  42.    blinking           = 128;               (* or with forground to blink *)
  43.  
  44. var
  45.    comport      : word;
  46.    (* Fossil comport
  47.       eg 0 = com1 *)
  48.    fossilerror  : word;
  49.    (* 0 = No error
  50.       1 = No carrier
  51.       2 = No Fossil
  52.       Note: Fossilerror is NOT tripped if the fossil is NOT present *)
  53.    localkey     : boolean;   (* whether key hit was local or not *)
  54.  
  55. type
  56.    str40  = string[40];
  57.    maxstr = string[255];
  58.  
  59. function  remotedataready : boolean;
  60. function  getremotechar : char;
  61. function  getkey : word;
  62. procedure idleloop;
  63. procedure putremotechar(putc : char);
  64. function  initfossil : boolean;
  65. procedure deinitfossil;
  66. function  carrierdetect : boolean;
  67. function  fossilerrorstring : str40;
  68. procedure flushoutput;
  69. procedure purgeoutput;
  70. procedure sendstring(s : maxstr);
  71. procedure sendchar(c : char);
  72. function  hotkey(var key : word) : boolean;
  73.  
  74. Implementation
  75.  
  76.  
  77. (* *************************************************
  78.    *                                               *
  79.    *    Function:    Remotedataready               *
  80.    *                                               *
  81.    *    Description: Returns true if data ready    *
  82.    *                 in FOSSIL "comport"           *
  83.    *                                               *
  84.    *    FossilError: 0=No Error                    *
  85.    *                 1=No Carrier                  *
  86.    *                                               *
  87.    ************************************************* *)
  88.  
  89. function remotedataready : boolean; assembler;
  90.  
  91. asm
  92.    mov fossilerror, 0;
  93.    cmp remoteinput, 0;
  94.    jz @noremoteinput;
  95.    mov ah, $03;  (* fossil status report *)
  96.    mov dx, comport;
  97.    int $14;
  98.    and al, carrierdetectvalue;   (* check carrier *)
  99.    jz @nocarrier;
  100.    and ah, $01;  (* data ready or not *)
  101.    mov al, ah;
  102.    jmp @finish;
  103.    @noremoteinput :
  104.       mov al, 0;
  105.       jmp @finish;
  106.    @nocarrier :
  107.       mov fossilerror, 1;
  108.       mov al, 0;
  109.    @finish :
  110. end;
  111.  
  112. (* *************************************************
  113.    *                                               *
  114.    *    Function:    Getremotechar                 *
  115.    *                                               *
  116.    *    Description: Returns character             *
  117.    *                 in FOSSIL "comport"           *
  118.    *                                               *
  119.    *   Note        : ONLY call if remotedataready  *
  120.    *                 As no checking is done for    *
  121.    *                    speed!                     *
  122.    *                                               *
  123.    *                                               *
  124.    *   Cairrer     : No Carrier Checking           *
  125.    *                                               *
  126.    ************************************************* *)
  127.  
  128. function getremotechar : char; assembler;
  129.  
  130. asm
  131.    mov ah, $02;
  132.    mov dx, comport;
  133.    int 14h;
  134. end;
  135.  
  136.  
  137. (* *************************************************
  138.    *                                               *
  139.    *   Function:     Getkey                        *
  140.    *                                               *
  141.    *   Description:  Keeps cycling until a key     *
  142.    *                 is hit (local or remote) or   *
  143.    *                 carrier is dropped            *
  144.    *                                               *
  145.    *                                               *
  146.    *   Note        : if no remote then only get    *
  147.    *                 key local                     *
  148.    *                                               *
  149.    *   Timers      : No TIMEOUTS!!!                *
  150.    *                                               *
  151.    *   Returns     : Character got (low byte)      *
  152.    *                 Special Key   (high byte)     *
  153.    *                                               *
  154.    *                                               *
  155.    *   FossilError : 0=No Error                    *
  156.    *                 1=No Carrier                  *
  157.    *                                               *
  158.    *   Localkey    : True=Local keyboard hitkey    *
  159.    *                 False=Remote keyboard hitkey  *
  160.    *                                               *
  161.    ************************************************* *)
  162.  
  163. function getkey : word;
  164.  
  165. var
  166.    chlow  : byte;
  167.    chhigh : byte;
  168.    keyhit : boolean;
  169.  
  170. begin
  171.    keyhit := false;
  172.    repeat
  173.       if localinput and keypressed then (* if key hit local *)
  174.          begin
  175.             chlow := ord(readkey);
  176.             if (chlow = 0) then
  177.                chhigh := ord(readkey) else
  178.                chhigh := 0;
  179.             keyhit   := true;
  180.             localkey := true;
  181.          end else
  182.       if remotedataready then (* if key hit remote *)
  183.          begin
  184.             chlow  := ord(getremotechar);
  185.             chhigh := 0;
  186.             keyhit := true;
  187.             localkey := false;
  188.          end else
  189.             idleloop; (* we're waiting, give away time *)
  190.    until (keyhit) or (fossilerror > 0);
  191.    if keyhit then
  192.       getkey := word(chlow) + word(chhigh) shl 8 else
  193.       getkey := 0;
  194. end;
  195.  
  196. (* *************************************************
  197.    *                                               *
  198.    *    Procedure:   Putremotechar                 *
  199.    *                                               *
  200.    *    FossilError: 0=No Error                    *
  201.    *                 1=No Carrier                  *
  202.    *                                               *
  203.    *    Note: Keeps cycling until enough space     *
  204.    *          in fossil buffer, then puts the      *
  205.    *          character                            *
  206.    *                                               *
  207.    *    Timers: No timers...                       *
  208.    *                                               *
  209.    *    FossilError: 0=No Error                    *
  210.    *                 1=No Carrier                  *
  211.    *                                               *
  212.    ************************************************* *)
  213.  
  214. procedure putremotechar(putc : char); assembler;
  215.  
  216. asm
  217.    mov fossilerror, 0;
  218.    cmp remoteoutput, 0; (* is fossil connected to output? *)
  219.    je @finish;
  220.    (* cmp fossilactive, 0;  Assumption: if RemoteOutput, Fossil IS Active
  221.       je @finish;  *)
  222.    @waitforcharfree :
  223.       mov ah, $03;      (* fossil status report *)
  224.       mov dx, comport;
  225.       int 14h;
  226.       and al, carrierdetectvalue;   (* carrier *)
  227.       jz  @nocarrier;
  228.       and ah, $20;   (* room in output buffer *)
  229.       jnz @charfree;
  230.       call idleloop; (* idle time waiting for free space *)
  231.       jmp @waitforcharfree;
  232.    @nocarrier :
  233.       mov fossilerror, 1;
  234.       jmp @finish;
  235.    @charfree :
  236.       mov ah, $01;   (* fossil put character *)
  237.       mov dx, comport;
  238.       mov al, putc;
  239.       int 14h;
  240.    @finish :
  241. end;
  242.  
  243. (* *************************************************
  244.    *                                               *
  245.    *    Function:    initfossil                    *
  246.    *                                               *
  247.    *    Note: CTS/RTS handshaking auto enabled!    *
  248.    *                                               *
  249.    *    Return:  True if Fossil Init OK            *
  250.    *                                               *
  251.    *    FossilActive: Set True if fossil init'd    *
  252.    *                                               *
  253.    ************************************************* *)
  254.  
  255. function initfossil : boolean; assembler;
  256.  
  257. asm
  258.    mov ah, $04;   (* init fossil *)
  259.    mov dx, comport;
  260.    mov bx, $00;
  261.    int $14;
  262.    cmp ax, $1954; (* is fossil alive? *)
  263.    je @fossilalive;
  264.    @fossildead :
  265.       mov al, $00;
  266.       jmp @finish;    (* fossil dead *)
  267.    @killfossil :
  268.       call deinitfossil;
  269.       jmp @fossildead;
  270.    @fossilalive :
  271.       cmp bh, $05;    (* check fossil V5.0? *)
  272.       jb  @killfossil;
  273.       cmp bl, $1B;    (* check fossil functions *)
  274.       jb  @killfossil;
  275.       mov ah, $0F;    (* set flow control *)
  276.       mov al, $02;    (* use CTS/RTS *)
  277.       mov dx, comport;
  278.       int $14;
  279.       mov al, $01;    (* fossil alive *)
  280.    @finish :
  281.    mov fossilactive, al;
  282.    mov remoteoutput, al;
  283.    mov remoteinput, al;
  284. end;
  285.  
  286. (* *************************************************
  287.    *                                               *
  288.    *    Procedure:   deinitfossil                  *
  289.    *                                               *
  290.    *                                               *
  291.    *    FossilActive: Set False                    *
  292.    *                                               *
  293.    ************************************************* *)
  294.  
  295. procedure deinitfossil; assembler;
  296.  
  297. asm
  298.    mov ah, $05; (* deinit fossil *)
  299.    mov dx, comport;
  300.    int $14;
  301.    mov al, false;
  302.    mov fossilactive, al;
  303.    mov remoteinput, al;
  304.    mov remoteoutput, al;
  305. End;
  306.  
  307. (* *************************************************
  308.    *                                               *
  309.    *    Function:    Carrier Detect                *
  310.    *                                               *
  311.    *    Description: Returns true if carrier       *
  312.    *                                               *
  313.    *    FossilError: 0=No Error                    *
  314.    *                 1=No Carrier                  *
  315.    *                 2=Fossil Not Active           *
  316.    *                                               *
  317.    *    Note: Does not depend on                   *
  318.    *          remoteinput or remoteoutput          *
  319.    *                                               *
  320.    ************************************************* *)
  321.  
  322. function carrierdetect : boolean; assembler;
  323.  
  324. asm
  325.    cmp fossilactive, true;  (* if fossil not alive exit *)
  326.    jne @nofossil;
  327.    mov ah, $03;  (* fossil status report *)
  328.    mov dx, comport;
  329.    int $14;
  330.    and al, carrierdetectvalue;   (* check carrier *)
  331.    jz @nocarrier;
  332.    mov al, $01;           (* carrier found *)
  333.    mov fossilerror, $00;
  334.    jmp @finish
  335.    @nofossil :
  336.       mov fossilerror, $02;
  337.       mov al, $00;
  338.       jmp @finish;
  339.    @nocarrier :
  340.       mov fossilerror, $01;
  341.       mov al, $00;
  342.    @finish :
  343. end;
  344.  
  345. (* *************************************************
  346.    *                                               *
  347.    *    Procedure:   flush fossil output buffer    *
  348.    *                                               *
  349.    *    Note:   This does not use the standard     *
  350.    *            fossil flush routine as carrier    *
  351.    *            may be dropped while flushing      *
  352.    *            meaning that some data may never   *
  353.    *            get out.  If, carrier drops this   *
  354.    *            routine aborts                     *
  355.    *                                               *
  356.    *   FossilError: 0=No Error                     *
  357.    *                1=No Carrier                   *
  358.    *                                               *
  359.    ************************************************* *)
  360.  
  361. procedure flushoutput; assembler;
  362.  
  363. asm
  364.    mov fossilerror, 0;
  365.    cmp fossilactive, true;  (* if fossil not alive exit *)
  366.    jne @finish;
  367.    @flushloop :
  368.       mov ah, $03;   (* fossil status report *)
  369.       mov dx, comport;
  370.       int $14;
  371.       and al, carrierdetectvalue;   (* check carrier *)
  372.       jz @nocarrier;
  373.       and ah, $40;   (* output buffer empty? *)
  374.       jnz @finish;
  375.       call idleloop; (* give away time while waiting *)
  376.       jmp @flushloop;
  377.    @nocarrier :
  378.       mov fossilerror, 1;
  379.    @finish :
  380. end;
  381.  
  382.  
  383. (* *************************************************
  384.    *                                               *
  385.    *    Procedure:   purge fossil output buffer    *
  386.    *                                               *
  387.    ************************************************* *)
  388.  
  389. procedure purgeoutput; assembler;
  390.  
  391. asm
  392.    cmp fossilactive, true;  (* if fossil not alive exit *)
  393.    jne @finish;
  394.    mov ah, $09;    (* fossil purge output function *)
  395.    mov dx, comport;
  396.    int $14;
  397.    @finish :
  398. end;
  399.  
  400.  
  401.  
  402. (* *************************************************
  403.    *                                               *
  404.    *    Procedure:   Idleloop                      *
  405.    *                                               *
  406.    *    Description: give away time to whatever    *
  407.    *                 wants it                      *
  408.    *                                               *
  409.    ************************************************* *)
  410.  
  411. procedure idleloop;
  412.  
  413. begin
  414.    (* implement your multi-tasker slicing here *)
  415. end;
  416.  
  417. (* *************************************************
  418.    *                                               *
  419.    *    Function:    FossilErrorString             *
  420.    *                                               *
  421.    *    Description: Returns String value of       *
  422.    *                 FossilError                   *
  423.    *                                               *
  424.    ************************************************* *)
  425.  
  426. function fossilerrorstring : str40;
  427.  
  428. begin
  429.    case fossilerror of
  430.       0 : fossilerrorstring := 'No Error';
  431.       1 : fossilerrorstring := 'No Carrier';
  432.       2 : fossilerrorstring := 'No Fossil';
  433.      else fossilerrorstring := 'Unknown Error';
  434.    end;
  435. end;
  436.  
  437. (* *************************************************
  438.    *                                               *
  439.    *    Procedure:   SendString                    *
  440.    *                                               *
  441.    *    Description: Sends String to Comms and     *
  442.    *                 to Local Console              *
  443.    *                                               *
  444.    *    FossilError: 0=No Error                    *
  445.    *                 1=No Carrier                  *
  446.    *                                               *
  447.    *    Note: String ALWAYS sent to local output   *
  448.    *          regardless of CARRIER                *
  449.    *                                               *
  450.    *    Speed: Faster SendString is available in   *
  451.    *           TPU format                          *
  452.    *                                               *
  453.    ************************************************* *)
  454.  
  455. procedure sendstring(s : maxstr);
  456.  
  457. var
  458.    loop : word;
  459.  
  460. begin
  461.    fossilerror := 0;
  462.    if localoutput then
  463.       write(s);
  464.    if remoteoutput then
  465.       begin
  466.          loop := 1;
  467.          while (loop <= length(s)) and (fossilerror = 0) do
  468.             begin
  469.                putremotechar(s[loop]);
  470.                inc(loop);
  471.             end;
  472.       end;
  473. end;
  474.  
  475. (* *************************************************
  476.    *                                               *
  477.    *    Procedure:   StrString                     *
  478.    *                                               *
  479.    *    Description: Sends String to Comms         *
  480.    *                                               *
  481.    *                                               *
  482.    *    FossilError: 0=No Error                    *
  483.    *                 1=No Carrier                  *
  484.    *                                               *
  485.    *    Speed: Faster StrString is available in    *
  486.    *           TPU format                          *
  487.    *                                               *
  488.    ************************************************* *)
  489.  
  490. procedure strstring(s : maxstr);
  491.  
  492. var
  493.    loop : word;
  494.  
  495. begin
  496.    fossilerror := 0;
  497.    if remoteoutput then
  498.       begin
  499.          loop := 1;
  500.          while (loop <= length(s)) and (fossilerror = 0) do
  501.             begin
  502.                putremotechar(s[loop]);
  503.                inc(loop);
  504.             end;
  505.       end;
  506. end;
  507.  
  508. (* *************************************************
  509.    *                                               *
  510.    *    Procedure:   SendChar                      *
  511.    *                                               *
  512.    *    Description: Sends Char to Comms and       *
  513.    *                 to Local Console              *
  514.    *                                               *
  515.    *    FossilError: 0=No Error                    *
  516.    *                 1=No Carrier                  *
  517.    *                                               *
  518.    *    Note: Char ALWAYS sent to local output     *
  519.    *          regardless of CARRIER                *
  520.    *                                               *
  521.    ************************************************* *)
  522.  
  523. procedure sendchar(c : char);
  524.  
  525. begin
  526.    if localoutput then
  527.       write(c);
  528.    putremotechar(c);
  529. end;
  530.  
  531. (* *************************************************
  532.    *                                               *
  533.    *   Function:     Hotkey                        *
  534.    *                                               *
  535.    *   Description:  Only gets a key if it is      *
  536.    *                 waiting                       *
  537.    *                                               *
  538.    *   Note        : if no remote then only get    *
  539.    *                 key local                     *
  540.    *                                               *
  541.    *   Key         : Character got (low byte)      *
  542.    *                 Special Key   (high byte)     *
  543.    *                                               *
  544.    *   Returns     : True=Character received       *
  545.    *                 False=No Character received   *
  546.    *                                               *
  547.    *                                               *
  548.    *   FossilError : 0=No Error                    *
  549.    *                 1=No Carrier                  *
  550.    *                                               *
  551.    *   Localkey    : True=Local keyboard hitkey    *
  552.    *                 False=Remote keyboard hitkey  *
  553.    *                                               *
  554.    ************************************************* *)
  555.  
  556. function hotkey(var key : word) : boolean;
  557.  
  558. var
  559.    chlow  : byte;
  560.    chhigh : byte;
  561.    keyhit : boolean;
  562.  
  563. begin
  564.    keyhit := false;
  565.    if localinput and keypressed then (* if key hit local *)
  566.       begin
  567.          chlow := ord(readkey);
  568.          if (chlow = 0) then
  569.             chhigh := ord(readkey) else
  570.             chhigh := 0;
  571.          keyhit   := true;
  572.          localkey := true;
  573.       end else
  574.    if remotedataready then (* if key hit remote *)
  575.       begin
  576.          chlow  := ord(getremotechar);
  577.          chhigh := 0;
  578.          keyhit := true;
  579.          localkey := false;
  580.       end;
  581.    if keyhit then
  582.       key := word(chlow) + word(chhigh) shl 8 else
  583.       key := 0;
  584.    hotkey := keyhit;
  585. end;
  586.  
  587. procedure txtcolour(f, b : byte);
  588.  
  589. begin
  590.    f := f and (15 + 128);
  591.    b := b and 7;
  592.    if localoutput then
  593.       begin
  594.          textattr := f or (b shl 4);
  595.       end;
  596.    if remoteoutput then
  597.       begin
  598.          if ((terminalcap and 2) = 2) then
  599.             begin
  600.                strstring(#22 + #1 + chr((f and 15) + b));
  601.                if ((f and blinking) = blinking) then
  602.                   strstring(#22 + #2);
  603.             end else
  604.          if ((terminalcap and 1) = 1) then
  605.             begin
  606.                if ((f and blinking) = blinking) then
  607.                   strstring(#27 + '[0;5m') else
  608.                   strstring(#27 + '[0m');
  609.             end;
  610.       end;
  611. end;
  612.  
  613. end.
  614.